﻿package com.tools
{
	import flash.net.URLRequest;
	import flash.media.Sound;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.ProgressEvent;
	
	import com.main.CustomDispatcher;
	
	import com.conf.PlayerSpec;
	
	import flash.media.SoundLoaderContext;
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	// SongLoader ::
	// - conteneur média de chanson à jouer
	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	public class SongLoader extends CustomDispatcher
	{
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// MEMBRES DE CLASSE
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		// l'url à charger
		private var _urlRequest 	: URLRequest;
		// l'objet son
		private var _soundFactory	: Sound;
		// l'état d'avancée du chargement
		private var _percentLoaded	: Number	= 0;
		// l'état de disponibilité du son
		private var _songReady		: Boolean 	= false;
		// l'état de lecture du son
		private var _playingSong	: Boolean	= false;
		// le contexte de chargement des sons (buffer)
		private var _context		: SoundLoaderContext = new SoundLoaderContext( PlayerSpec.SONG_BUFFER_MILLISECONDS, false );
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// CONSTRUCTEUR
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		function SongLoader( url : String = null )
		{
			if ( url )
				initUrl ( url );
		}
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// METHODE PUBLIQUE : lancer le chargement d'une url
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function initUrl( url : String ) : void
		{
			soundFactory 	= new Sound( null, _context );
			_urlRequest 	= new URLRequest( url );
			initLoading( );
		}
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// METHODES PRIVEES : gestionnaire de chargement
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		// initialisation du chargement du son
		private function initLoading( ) : void
		{
			soundFactory.addEventListener( Event.COMPLETE, completeHandler );
            soundFactory.addEventListener( Event.ID3, id3Handler );
            soundFactory.addEventListener( IOErrorEvent.IO_ERROR, ioErrorHandler );
            soundFactory.addEventListener( ProgressEvent.PROGRESS, progressHandler );
			soundFactory.load( _urlRequest );
		}
		
		// lorsque le chargement est complet
		private function completeHandler( pEvt : Event ) : void
		{
			trace("chargement de la musique complet !!");
			soundFactory.removeEventListener( Event.COMPLETE, completeHandler );
            soundFactory.removeEventListener( Event.ID3, id3Handler );
            soundFactory.removeEventListener( IOErrorEvent.IO_ERROR, ioErrorHandler );
            soundFactory.removeEventListener( ProgressEvent.PROGRESS, progressHandler );
		}
		
		// gestion de la récupération des informations id3tag du son
		private function id3Handler( pEvt : Event ) : void
		{
			trace("infos ID3 tag dispos");
		}
		
		// gestion de l'erreur au chargement
		private function ioErrorHandler( pEvt : IOErrorEvent ) : void
		{
			songReady = false;
			trace("erreur au chargement de la musique");
		}
		
		// méthode à effacer puisque le contexte est déjà défini dans le buffer
		private function progressHandler( pEvt : ProgressEvent ) : void
		{
			_percentLoaded = pEvt.bytesLoaded;
			var reference : Number;
			if ( pEvt.bytesTotal < PlayerSpec.SONG_BUFFER_FILESIZE )
					reference = pEvt.bytesTotal;
			else 	reference = PlayerSpec.SONG_BUFFER_FILESIZE;
			if ( pEvt.bytesLoaded >= reference )
				songReady = true;
		}
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// GETTER & SETTER
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function get songReady( ) : Boolean
		{
			return _songReady;
		}
		
		public function set songReady ( val : Boolean ) : void
		{
			_songReady = val;
		}
		
		public function get playingSong( ) : Boolean
		{
			return _playingSong;
		}
		
		public function set playingSong ( val : Boolean ) : void
		{
			_playingSong = val;
		}
		
		public function get soundFactory( ) : Sound
		{
			return _soundFactory;
		}
		
		public function set soundFactory ( val : Sound ) : void
		{
			_soundFactory = val;
		}
	}
}